// 类的装饰器
// 装饰器本身是一个函数
// 类装饰器接受的参数是构造函数
// 装饰器通过 @ 符号来使用
// 使用装饰器语法需要开启 tsconfig.json 文件下的
// {
//     "experimentalDecorators": true,
//     "emitDecoratorMetadata": true
// }
// 装饰器的执行时期是在声明类之后就立即执行装饰器，对类进行装饰
// 类的装饰器接收的参数是 constructor
function testDecorator(constructor: any) {
  console.log("decorator");
}

function testDecorator1(flag: boolean) {
  // 使用工厂模式返回装饰器函数
  if (flag) {
    return function (constructor: any) {
      constructor.prototype.getName = () => {
        console.log("dell");
      };
    };
  } else {
    // 返回空装饰器
    return function (constructor: any) {};
  }
}

@testDecorator
@testDecorator1(true)
class Test_05_01 {}

const test_05_01 = new Test_05_01();
(test_05_01 as any).getName();
